/*lic*/
#ifndef __BSP_RTC_INIT_HELPER_H__
#define __BSP_RTC_INIT_HELPER_H__

#include "main.h"

extern char time_buf[64];

#define RTC_3027_ADDR 0x32
extern Rtc_Ctrl_Task_Def ext_rtc_ctrl;

// 内部RTC中断
void INT_SRC_RTC_PRD_IrqCallback(void);
// 内部RTC闹钟中断。每天0点启动
void INT_SRC_RTC_ALM_IrqCallback(void);

// i2c事件集事件定义
// i2c接收完成事件
#define I2C2_RX_COMPLATE (1 << 0)
#define I2C4_TX_COMPLATE (1 << 1)


// RTC状态
extern uint8_t inner_rtc_status;
// 状态位标志
#define RTC_INITED 0x01
// RTC对时状态
#define RTC_NTP 0x02
// RTC固定间隔时刻中断（类似于秒中断，分钟中断，即对应寄存器发生变化即发生中断）
#define RTC_PRE_TIMER_NVIC 0x04
// RTC频率中断，HZ，也可每秒，每分钟，每小时。不对齐0时刻
#define RTC_FREQ_NVIC 0x08
// RTC闹钟中断
#define RTC_ALERT_NVIC 0x10
// RTC发生错误
#define RTC_ERR 0x20
// RTC自动对时
#define RTC_AUTO_NTP 0x40
// RTC自动对时锁定，如果为1，即使手动对时也不会自动关闭自动对时
#define RTC_AUTO_NTP_LOCK 0x80

// 外部RTC状态
extern Rtc_Ctrl_Task_Def ext_rtc_ctrl;
// 初始化状态位标志
#define EXT_RTC_INITED 0x01
// RTC芯片写保护状态
#define EXT_RTC_WRITEABLE 0x02
// RTC芯片对时状态
#define EXT_RTC_NTP 0x04
// RTC芯片固定间隔时刻中断（类似于秒中断，分钟中断，即对应寄存器发生变化即发生中断）
#define EXT_RTC_PRE_TIMER_NVIC 0x08
// 初始化秒中断
#define EXT_RTC_INIT_PRE_TIMER_NVIC 0x10
// 开启32.768K时钟
#define EXT_RTC_32K_NVIC 0x20

typedef struct __Tag_Rtc_Time_Def{
	uint8_t year;
	uint8_t month;
	uint8_t day;
	uint8_t hour;
	uint8_t minute;
	uint8_t second;
	uint8_t millisecond;
	char iso_time_str[28];
	rt_err_t (*Build_Rtc_Time_Str)(struct __Tag_Rtc_Time_Def* obj);
	rt_err_t (*Build_Innner_Rtc_Time)(struct __Tag_Rtc_Time_Def* obj);
	rt_err_t (*Read_Ext_Rtc_Time)(struct __Tag_Rtc_Time_Def* obj);
} Rtc_Time_Def;
// 初始化RTC管理对象
rt_err_t Init_Rtc_Time_Obj(Rtc_Time_Def* obj);
// 构建时间字符串
rt_err_t Build_Rtc_Time_Str_Interface(Rtc_Time_Def* obj);
// 使用内部RTC构建时间字符串。
rt_err_t Build_Innner_Rtc_Time_Interface(Rtc_Time_Def* obj);
// 读取外部RTC时间。
rt_err_t Read_Ext_Rtc_Time_Interface(Rtc_Time_Def* obj);

// 外部RTC时间记录
extern Rtc_Time_Def ext_rtc_time;
// 内部RTC时间记录
extern Rtc_Time_Def inner_rtc_time;
// 内部RTC中断
void INT_SRC_RTC_PRD_IrqCallback(void);
// 内部RTC闹钟中断。每天0点启动
void INT_SRC_RTC_ALM_IrqCallback(void);

//RTC Config
void App_RTCCfg(void);
// 外部RTC输入中断1
void INT_SRC_PORT_EIRQ10_IrqCallback(void);

void Init_Ext_Clock(void);
// 写入内部RTC
rt_err_t Write_Rtc_Data_Time(Rtc_Time_Def *ext_rtc_time);

// 外部RTC所有命令之间要有个2ms的延时，由于很多时候命令都是单独的，不会连续执行。所以这个间隔自行添加
// 读写保护
// 注意，对RTC的读写不会默认开启写保护。所以每次要手动调用
rt_err_t Sd3078_Write_Enable(void);
rt_err_t Sd3078_Write_Disable(void);
// 设置RTC时间。默认24小时制，如果需要12小时，直接进入改函数。周也是
rt_err_t Sd3078_Write_Data_Time(uint8_t year, uint8_t month, uint8_t day, uint8_t hour, uint8_t minute, uint8_t second);
// 读取外部RTC时间
rt_err_t Sd3078_Read_Data_Time(Rtc_Time_Def *ext_rtc_time);
// 开启32.768K频率输出
rt_err_t Sd3078_Start_32K(Rtc_Time_Def *obj);
// 关闭32.768K频率输出
rt_err_t Sd3078_Stop_32K(Rtc_Time_Def *obj);
// 初始化秒中断
rt_err_t Sd3078_Init_Sec_Intc(void);
// 启动初始化秒中断
rt_err_t Sd3078_Start_Sec_Intc(void);
// 关闭初始化秒中断
rt_err_t Sd3078_Stop_Sec_Intc(void);

// RTC任务运行函数
void Thread_Rtc_Run(void *parmameter);
#endif /* __BSP_RTC_INIT_HELPER_H__ */

/*eof*/
